import { Node } from "cc";

export default class EventMgr{

    private static inst:EventMgr = null;

    public static get Inst():EventMgr{
        if(!this.inst)this.inst = new EventMgr();
        return this.inst;
    }

    eventNames:Map<string,Node> = new Map<string,Node>();

    /**
     * 
     * @param obj 执行对象 this
     * @param n 绑定的节点 this.node
     * @param func 绑定的方法
     * @param eventName 事件名称
     */
    on( obj:any , n:Node ,func:Function , eventName:string ){
        n.on(eventName,func,obj);
        this.eventNames.set(eventName , n);
        
        console.log("绑定事件：" , eventName);
    }

    /**
     * 
     * @param obj 执行对象 this
     * @param n 绑定的节点 this.node
     * @param func 绑定的方法
     * @param eventName 事件名称
     */
    off(obj:any , n:Node ,func:Function , eventName:string){
        n.off(eventName,func,obj);

        if(this.eventNames.has(eventName)) {
            let _node = this.eventNames.get(eventName);
            if(_node == n){
                this.eventNames.delete(eventName);
            }
        }
        
        console.log("解绑事件：" , eventName);
    }

    /**
     * 
     * @param eventName 事件名称
     * @param arg1 参数1
     * @param arg2 参数2
     * @param arg3 参数3
     * @param arg4 参数4
     * @param arg5 参数5
     */
    emit(eventName:string , arg1?: any, arg2?: any, arg3?: any, arg4?: any, arg5?: any){
        if(this.eventNames.has(eventName)) {
            console.log("执行事件：" , eventName);

            let _node = this.eventNames.get(eventName);
            _node.emit(eventName , arg1 , arg2 , arg3 , arg4 , arg5);
        }
        else
            console.log("事件不存在：" , eventName);
    }

}
